자바스크립트 메모리관리
❓질문
자바스크립트에서 메모리 관리에 대해 설명해주세요
💡 조사하기전 내가 알고 있던 내용
자바스크립트의 메모리 관리에는 할당과 해제를 예로 들 수 있습니다.
변수를 선언할때 원시값 혹은 객체값으로 표현선언 할 수 있는데 이때 원시값은 스택 형태의자료구조로 담겨 할당되고 객체는 힙 자료구조의 형태로 할당됩니다.
메모리의 해제는 자바스크립트 가비지 컬렉터가 해제를 하는데 이때 해제를 할때 해당 변수가 지금 참조를 당하고있는지를 판단하여 해제를 합니다
그렇기 때문에 전역 변수나 API 호출등 사이드 이펙트가 발생할수있는 즉 비순수 함수인 경우 가비지 컬렉터가 이를 판별하지 못해 메모리 할당 해제를 할 수 없게됩니다.
🏫 정리한 내용
위 가비지 컬렉션 알고리즘을 Reference-counting이라고 합니다 객체가 참조되는 횟수를 추적하고 참조 횟수가 0이 되면 메모리에서 해제되는 방식입니다.
단 이 방식을 사용했을때 순환 참조가 발생할 경우 참조 카운트가 0이 되지않아 메모리에서 해제되지않는 문제가 발생할 수 있습니다.
그렇기 때문에 Mark-and-sweep 알고리즘을 사용하기도 합니다 이는 루트 객체에서 시작하여 참조되는 객체를 표시하고, 마지막까지 표시 되지 않는 객체를 찾아 메모리를 청소 하는 방식입니다.
이 방식은 순환 참조가 발생하더라도 루트에 도달이 불가능하다면 표시가 되지 않습니다.